package sessionbeans;

import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import model.Cliente;
import model.Cotizacion;
import model.ItemCotizacion;
import ws.client.AdministradorFacadeBean;
import ws.client.AdministradorFacadeBeanService;
import xml.model.CotizacionXML;
import xml.model.ItemCotizacionXML;
import xml.model.ItemRespuestaCotizacionXML;
import xml.model.ItemXML;
import xml.model.PedidoCotizacionXML;
import xml.model.RespuestaCotizacionXML;
import xml.model.SolicitudCotizacionXML;

import com.thoughtworks.xstream.XStream;

/**
 * Session Bean implementation class AdministradorOperaciones
 */
@Stateless
@WebService
public class AdministradorOperacionesBean implements AdministradorOperaciones {
	
	@PersistenceContext(unitName = "OficinaVentasPU")
    private EntityManager em;
	
	@EJB
	private AdministradorClientes administradorClientes;
	@EJB
	private AdministradorCotizaciones administradorCotizaciones;
	
    public AdministradorOperacionesBean() {}

    @WebMethod
    public String solicitarCotizacion(String xml) {
    	//recibir solicitud de cotizacion en xml del cliente
    	SolicitudCotizacionXML solicitudCotizacion = deserializarSolicitudCotizacion(xml);
		System.out.println("id cliente: " + solicitudCotizacion.getClienteXML().getId());
		System.out.println("Items:");
		for(ItemXML itemXML : solicitudCotizacion.getListaItemSolCot()){
			System.out.println("id : " + itemXML.getCodigo());
		}
		
		//Generar el pedido de cotizacion para enviar a CC y se lo envio a CC
		
		String pedidoCotizacion = armarSerializarPedidoCotizacion(solicitudCotizacion);

		System.out.println(pedidoCotizacion);
		
		AdministradorFacadeBeanService administradorFacadeBeanService = new AdministradorFacadeBeanService();
		AdministradorFacadeBean administradorFacadeBean = administradorFacadeBeanService.getAdministradorFacadeBeanPort();
		String stringcotizacion = administradorFacadeBean.publicarComparativaDePrecios(pedidoCotizacion);
		
	//recibido "cotizacionXML" de CC lo convierto en objeto
	CotizacionXML cotizacionXML = deserializarCotizacionXML(stringcotizacion);

	System.out.println("dias de vigencia vigencia: " + cotizacionXML.getVigencia());
	
	Date fechaemision = new Date(cotizacionXML.getFechaemision());
	//Integer ano = fechaemision.getYear()+1900;
	//System.out.println("fecha emision: " + ano+"/"+fechaemision.getMonth()+"/"+ fechaemision.getDay());
	
	System.out.println(fechaemision.toString());
	for(ItemCotizacionXML item : cotizacionXML.getlistaItemCotizacion()){
		System.out.println("Codigo:"+item.getCodigo());
	}


	//teniendo el objeto "CotizacionXML" con lo que devolvio CC genero la cotizacion que voy a persistir
	//obtengo el cliente de la solicitud de cotizacion
	Cliente cliente = new Cliente();

	cliente.setVO(administradorClientes.obtenerClienteVOPorId(solicitudCotizacion.getClienteXML().getId()));
	System.out.println(cliente.getIva());
	//en primer lugar genero la cotizacion 
	Cotizacion cotizacion = generarCotizacion(cotizacionXML, cliente);
	em.persist(cotizacion);
	System.out.println("Cotizacion persistida: " + cotizacion.getId());
	//genero la respuesta cotizacion XML para enviar al cliente
	
	RespuestaCotizacionXML respuestaCotizacionXML = crearRespuestaCotizacion(cotizacion);
	
	//serializo la respuesta
	
	String respuestaCotizacion = serializarRespuestaCotizacion(respuestaCotizacionXML);
	System.out.println(respuestaCotizacion);
	return respuestaCotizacion;
}
    private String serializarRespuestaCotizacion(RespuestaCotizacionXML respuestaCotizacionXML){
    	System.out.println("\n\nGenerandoRespuesta de Cotizacion a enviar a el Cliente.. \n");
    	XStream xstreamRespuestaCotizacion= new XStream();
    	xstreamRespuestaCotizacion.alias("RespuestaCotizacion", RespuestaCotizacionXML.class);
    	xstreamRespuestaCotizacion.autodetectAnnotations(true);
    	String respuestaCotizacion= xstreamRespuestaCotizacion.toXML(respuestaCotizacionXML);
    	return respuestaCotizacion;
    }
    
    private RespuestaCotizacionXML crearRespuestaCotizacion (Cotizacion cotizacion){
    	
    	RespuestaCotizacionXML respuestaXML = new RespuestaCotizacionXML();
    	respuestaXML.setFechaemision(cotizacion.getFechaemision());
    	List<ItemRespuestaCotizacionXML> listItems = new ArrayList<ItemRespuestaCotizacionXML>();
    	for (ItemCotizacion item:cotizacion.getListaItemCotizacion()){
    		ItemRespuestaCotizacionXML itemrsta = new ItemRespuestaCotizacionXML();
    		itemrsta.setCantidad(item.getCantidad());
    		itemrsta.setCaracteristicas(item.getCaracteristicas());
    		itemrsta.setCodigo(item.getCodigo());
    		itemrsta.setMarca(item.getMarca());
    		itemrsta.setOrigen(item.getOrigen());
    		itemrsta.setPrecioCondDescuentoInteres(item.getPrecioConDescuentoInteres());
    		itemrsta.setPrecioFinal(item.getPrecioFinal());
    		itemrsta.setPrecioUnitario(item.getPrecioUnitario());
    		listItems.add(itemrsta);
    	}
    	respuestaXML.setListaItemRespuestaCotizacion(listItems);
    	respuestaXML.setMontoFinal(cotizacion.getMontoFinal());
    	respuestaXML.setVigencia(cotizacion.getVigencia());
    	return respuestaXML;
    	
    }
    
	private  SolicitudCotizacionXML deserializarSolicitudCotizacion(String xml){

    	System.out.println("\n\nParseando Solicitud de Cotizacion recibida.. \n");
        	
        	XStream xstreamSolicitudCotizacion = new XStream();
    	xstreamSolicitudCotizacion.alias("SolicitudCotizacion", SolicitudCotizacionXML.class);
    	xstreamSolicitudCotizacion.autodetectAnnotations(true);
    		
    	SolicitudCotizacionXML solicitud = (SolicitudCotizacionXML) xstreamSolicitudCotizacion.fromXML(xml);
    	
    	return solicitud;
    }
    
	private Cotizacion generarCotizacion (CotizacionXML cotizacionXML, Cliente cliente){
		Double montofinal = (double) 0;
		Cotizacion cotizacion = new Cotizacion();
		cotizacion.setFechaemision(cotizacionXML.getFechaemision());
		cotizacion.setCliente(cliente);
		cotizacion.setVigencia(cotizacionXML.getVigencia());
		List<ItemCotizacion> listaItemsCotizacion = new ArrayList<ItemCotizacion>();
		for(ItemCotizacionXML item: cotizacionXML.getlistaItemCotizacion()){
			ItemCotizacion itemCotizacion = new ItemCotizacion();
			itemCotizacion.setCantidad(item.getCantidad());
			itemCotizacion.setCaracteristicas(item.getCaracteristicas());
			itemCotizacion.setCodigo(item.getCodigo());
			itemCotizacion.setIdlistaprecios(item.getIdlistaprecios());
			itemCotizacion.setMarca(item.getMarca());
			itemCotizacion.setOrigen(item.getOrigen());
			itemCotizacion.setPrecioUnitario(item.getPrecio());
			Double precio= item.getPrecio();
			//PRECIO CON INTERES SI ES QUE LO TIENE
			precio = precio*(1+((cliente.getCondicionVenta().getInteres())/100));
			
			//PRECIO CON INTERES LE HAGO EL DESCUENTO CORRESPONDIENTE
			precio = precio* (1-(cliente.getDescuento()/100));
			//ASIGNO EL PRECIO CON DESCUENTO E INTERES
			itemCotizacion.setPrecioConDescuentoInteres(precio);
			//CALCULO EL PRECIO FINAL ES DECIR AL PRECIO CON DESCUENTO E INTERES LE AGREGO EL IVA
			precio=precio*(1+(cliente.getIva()/100));
			itemCotizacion.setPrecioFinal(precio);
			montofinal +=precio*itemCotizacion.getCantidad();
			itemCotizacion.setCotizacion(cotizacion);
			//em.persist(itemCotizacion);
			
			listaItemsCotizacion.add(itemCotizacion);
		}
		cotizacion.setListaItemCotizacion(listaItemsCotizacion);
		cotizacion.setMontoFinal(montofinal);
		return cotizacion;
	}
    
	@SuppressWarnings("unused")
	private String armarSerializarPedidoCotizacion(SolicitudCotizacionXML solicitud){
		
		
		System.out.println("\n\nGenerando Pedido de Cotizacion a enviar a CC.. \n");
		XStream xstreamPedidoCotizacion = new XStream();
		xstreamPedidoCotizacion.alias("PedidoCotizacion", PedidoCotizacionXML.class);
		xstreamPedidoCotizacion.autodetectAnnotations(true);
		PedidoCotizacionXML pedidoXML = new PedidoCotizacionXML();
		pedidoXML.setListaItemPedidoCotizacion(solicitud.getListaItemSolCot());
		String stringpedidoCotizacion = xstreamPedidoCotizacion.toXML(pedidoXML);
		return stringpedidoCotizacion;
	
	}
	
	private CotizacionXML deserializarCotizacionXML(String cotizacionXML){
		System.out.println("\n\nConvirtiendo cotizacionXML recibido de CC en objeto.. \n");
		XStream xstreamCotizacion = new XStream();
		xstreamCotizacion.alias("Cotizacion", CotizacionXML.class);
		xstreamCotizacion.autodetectAnnotations(true);
		CotizacionXML cotizacion = (CotizacionXML) xstreamCotizacion.fromXML(cotizacionXML);
		return cotizacion;
	}
}
